package com.niuke;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * 24. 高效的任务规划
 * https://zhuanlan.zhihu.com/p/639909595
 */
public class NiukeMoni24nan {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int m = Integer.parseInt(scanner.nextLine());

        List<List<List<Integer>>> allData = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            int n = Integer.parseInt(scanner.nextLine());
            List<List<Integer>> data = new ArrayList<>();
            for (int j = 0; j < n; j++) {
                String[] arr = scanner.nextLine().split(" ");
                List<Integer> item = new ArrayList<>();
                item.add(Integer.parseInt(arr[0])); // 服务器配置时长
                item.add(Integer.parseInt(arr[1])); // 服务器运行任务时长
                data.add(item);
            }

            // 用运行任务时长做倒叙排序
            data.sort(new Comparator<List<Integer>>() {
                @Override
                public int compare(List<Integer> integers, List<Integer> t1) {
                    return t1.get(1) - integers.get(1);
                }
            });

            allData.add(data);
        }


        for (int i = 0; i < allData.size(); i++) {
            List<List<Integer>> data = allData.get(i);
            int[] dp = new int[data.size()];
            int[] dpTemp = new int[data.size()]; // 统计前面的配置时间之和
            dp[0] = data.get(0).get(0) + data.get(0).get(1);
            dpTemp[0] = data.get(0).get(0);
            for (int j = 1; j < data.size(); j++) {
                dpTemp[j] = dpTemp[j - 1] + data.get(j).get(0);
                dp[j] = Math.max(dp[j - 1], dpTemp[j] + data.get(j).get(1));
            }

            System.out.println(dp[data.size() - 1]);
        }

    }

}
